package com.arron.classLoadAndInnit;

/**
 * @Classname Son
 * @Description TODO
 * @Date 2020/8/15 17:26
 * @Created by 刘
 */

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 *
 * 子类的初始化，执行<clinit()>方法,执行顺序取决于代码编写顺序
 *  1.执行静态赋值代码 int j= method();
 *  2.执行静态代码块
 *
 *  子类的实例化 ，执行init方法
 *  1.super方法（最前）
 *  2.i= test();
 *  3.非静态代码块
 *  4.构造方法（最后）
 *
 */
public class Son extends Father {

    private int i= test();
    private static  int j= method();


    static {
        System.out.println("(7)");
    }
    public Son(){
        super();//加与不加都存在
        System.out.println("(10)");
    }
    {
        System.out.println("(9)");
    }

    public int test() {
        System.out.println("(8)");
        return 1;
    }

    public static int method() {
        System.out.println("(6)");
        return 1;
    }

    public static void main(String[] args) {

        //1.类初始化，先执行父类的初始化，在执行子类的初始化

        //2.实例化对象初始化
        /**
         *
         *  实例化过程执行init()方法
         *  1.<init()>方法可能重载多个，有几个构造器就有几个init方法
         *  2.<init()>方法由非静态实例变量显示赋值代码，非静态代码块，对应构造器代码组成
         *  3.构造器代码始终最后执行，非静态实例变量显示赋值代码，非静态代码块按编码顺序执行
         *  4.每次创建实例对象，调用对应构造器，执行init()方法
         *  5.init方法的首行对应的是super()，即对应父类的init()方法
         *  6.执行实例化过程中，涉及到方法的重写（这些方法不会被重写：final方法，静态方法，private修饰的方法）
         *
         */

        Son s=new Son();
        System.out.println("==========================");
        Son s2=new Son();

        Map<String,String> map = new Hashtable<>();

        map.put(null,null);




    }
}
